/**
 ****************************************
 * @file data_cache.h
 * @author: AnRui
 * @version 0.1
 * @date  : 2025-11-09
 * @copyright Copyright (c) 2025
 * @desc:
 *      开辟一个num字节的数组
 *      可以通过input传入数据 通过output提取数据,提取数据的时候 后面的数据会整体向前迁移1位
 *      读取数据后 使用memmove把数据整体前移一位  效率低
 *
 * ***************************************
 */
#ifndef _DATA_CACHE_H
#define _DATA_CACHE_H

#include "gd32f30x.h"
#include <stdio.h>
#include <string.h>



 /**
  * @brief 缓存大小宏定义（定义接收缓存的最大容量）
  *        此处设置为512字节，可根据实际需求修改（需大于单次最大数据量，如最长命令行长度）
  */
#define SP_RECV_DATA_CACHE_SIZE    100

typedef struct {
  uint8_t dat[SP_RECV_DATA_CACHE_SIZE];  // 缓存数据存储数组（实际存放接收的字节）
  uint8_t ptr;                           // 下一个数据的写入索引
} sp_recv_data_cache;

/**
 * @brief 全局缓存实例声明（外部可见）
 *        该变量在对应的.c文件（如data_cache.c）中定义，其他文件通过包含本头文件可访问此缓存
 */
extern sp_recv_data_cache cache;

/**
 * @brief 缓存模块初始化函数声明
 */
void data_cache_init(void);

/**
 * @brief 向缓存中写入数据的函数声明（通常由中断服务程序调用）
 * @param dat：待写入的单字节数据（如UART接收的一个字符）
 * @note 逻辑：若缓存未满，将数据存入dat数组的ptr位置，然后ptr自增（长度+1）
 */
void recv_data_cache_input(uint8_t dat);

/**
 * @brief 从缓存中读取数据的函数声明（通常由应用任务调用，如Shell任务）
 * @param dat：用于接收读取结果的指针（输出参数，存储读出的字节）
 * @note 逻辑：若缓存非空，取出dat[0]的数据，后续数据整体前移，ptr自减（长度-1）
 */
void recv_data_cache_output(uint8_t* dat);

#endif
